3分钟带你实现Spring Batch的文件分片
先来一波需求分析。我们这个例子实现一个简单的需求,就是将一个目录下边的文件读出来,在每一行前边加上读这行文件的线程名称,然后打印出来。所以我们第一先在resource下边新建三个文件:
文件里面写几行数据:
好了,准备工作已经做完了,下边开始干活吧。
Step 1: 新建一个Spring Boot的工程,引入Spring Batch 的依赖
如果一直关注鹏哥的话,这一步应该不在话下了,已经成为每天的必修课了。如果还不会请自觉面壁思过,然后重读文章
Step 2: 配置文件的分区规则
这里鹏哥采用一个文件一个分区的方式,使用Batch自带的MultiResourcePartitioner 来实现分区规则,这里有个小的知识点就是如何根据路径获取Resource[] 。keyName 是我们要往ExecuteContext 里面放置参数时的key,在下边Reader里面读取这个参数时需要。
Step 3: 配置Reader/Processor/Writer
因为是读文件,我们选用FlatFileItemReader 作为我们的Reader 实现。同时传入Context 中的文件路径作为Resource 。这里只是一个文件路径,Spring 会自动帮我们把文件的路径转化为一个Resource对象。
Processor 则是在每一行读出的数据前边加上鹏哥的网名。
Writer 是在每一行的前边加上当前线程的名称。
Step 4:为Step 添加Listener
参照前边数据库分区的例子SpringBatch从入门到放弃011- 一个典型的数据库分片处理的例子。
Step 5:定义执行业务逻辑的Step
定义方法和之前数据库分区的一样。
Step 6: 定义执行Step的Handler
我们使用TaskExecutorPartitionHandler 作为我们的载体。
Step 7: 定义master Step
Step 8: 组装Job
Step 9:测试Job,并查看结果
我们在Listener 中打印出来每一个线程对应的Step Name和ExecuteContext 的值。分析日志我们看出,三个文件我们分了三片执行,每一片使用哪个线程,执行那个文件也清晰的反应在了日志里面。
在来看Writer 里面打印出来的日志,也能看出多线程执行了程序,每个线程执行执行了什么内容,也能清晰的反应。
好了,今天的文件分区执行的例子已经分享完了,现实项目中可以直接按照这个例子配置即可,当然因为不同的需求不同,分区规则肯定也不同,这个需要每个项目自己客户化的。
END
往期精彩7min 到 40s:SpringBoot 启动优化实践!柔性事务的分布式事务解决方案设计探究
Spring Boot 项目鉴权的 4 种方式
Spring Batch 批量处理,骚气又强大!